//
//  HGSCoreExtensionPoints.m
//
//  Copyright (c) 2008 Google Inc. All rights reserved.
//
//  Redistribution and use in source and binary forms, with or without
//  modification, are permitted provided that the following conditions are
//  met:
//
//    * Redistributions of source code must retain the above copyright
//  notice, this list of conditions and the following disclaimer.
//    * Redistributions in binary form must reproduce the above
//  copyright notice, this list of conditions and the following disclaimer
//  in the documentation and/or other materials provided with the
//  distribution.
//    * Neither the name of Google Inc. nor the names of its
//  contributors may be used to endorse or promote products derived from
//  this software without specific prior written permission.
//
//  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
//  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
//  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
//  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
//  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
//  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
//  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
//  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
//  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
//  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
//  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//

#import "HGSCoreExtensionPoints.h"

#import "HGSSearchSource.h"
#import "HGSAction.h"
#import "HGSAccount.h"
#import "HGSAccountsExtensionPoint.h"
#import "HGSAccountType.h"
#import "HGSPlugin.h"

NSString* const kHGSActionsExtensionPoint = @"HGSActionsExtensionPoint";
NSString* const kHGSSourcesExtensionPoint = @"HGSSourcesExtensionPoint";
NSString* const kHGSServicesExtensionPoint = @"HGSServicesExtensionPoint";
NSString *const kHGSAccountsExtensionPoint = @"HGSAccountsExtensionPoint";
NSString *const kHGSPluginsExtensionPoint = @"HGSPluginsExtensionPoint";
NSString *const kHGSAccountTypesExtensionPoint = @"HGSAccountTypesExtensionPoint";

static BOOL isInitialized = NO;

static void InitializeCategory(void) {
  HGSExtensionPoint *ep;
  ep = [HGSExtensionPoint pointWithIdentifier:kHGSActionsExtensionPoint];
  [ep setKindOfClass:[HGSAction class]];
  ep = [HGSExtensionPoint pointWithIdentifier:kHGSSourcesExtensionPoint];
  [ep setKindOfClass:[HGSSearchSource class]];
  ep = [HGSExtensionPoint pointWithIdentifier:kHGSServicesExtensionPoint];
  [ep setKindOfClass:[HGSExtension class]];
  ep = [HGSExtensionPoint pointWithIdentifier:kHGSPluginsExtensionPoint];
  [ep setKindOfClass:[HGSPlugin class]];
  ep = [HGSAccountsExtensionPoint
        pointWithIdentifier:kHGSAccountsExtensionPoint];
  [ep setKindOfClass:[HGSAccount class]];
  ep = [HGSExtensionPoint pointWithIdentifier:kHGSAccountTypesExtensionPoint];
  [ep setKindOfClass:[HGSAccountType class]];
  isInitialized = YES;
}

@implementation HGSExtensionPoint (HGSCoreExtensionPoints)

+ (HGSExtensionPoint*)actionsPoint {
  if (!isInitialized) InitializeCategory();
  return [self pointWithIdentifier:kHGSActionsExtensionPoint];
}

+ (HGSExtensionPoint*)sourcesPoint {
  if (!isInitialized) InitializeCategory();
  return [self pointWithIdentifier:kHGSSourcesExtensionPoint];
}

+ (HGSExtensionPoint*)servicesPoint {
  if (!isInitialized) InitializeCategory();
  return [self pointWithIdentifier:kHGSServicesExtensionPoint];
}

+ (HGSExtensionPoint*)pluginsPoint {
  if (!isInitialized) InitializeCategory();
  return [self pointWithIdentifier:kHGSPluginsExtensionPoint];
}

+ (HGSAccountsExtensionPoint*)accountsPoint {
  if (!isInitialized) InitializeCategory();
  HGSExtensionPoint *ep = [self pointWithIdentifier:kHGSAccountsExtensionPoint];
  return (HGSAccountsExtensionPoint *)ep;
}

+ (HGSExtensionPoint*)accountTypesPoint {
  if (!isInitialized) InitializeCategory();
  return [self pointWithIdentifier:kHGSAccountTypesExtensionPoint];
}

@end
